package org.hydrakyoufeng.qiniu;

import java.util.Map;

import org.hydrakyoufeng.base.annotation.doc.Api;
import org.hydrakyoufeng.base.annotation.doc.ApiImplicitParam;
import org.hydrakyoufeng.base.annotation.doc.ApiOperation;
import org.hydrakyoufeng.base.annotation.doc.ApiResultParam;
import org.hydrakyoufeng.base.annotation.doc.DataType;
import org.hydrakyoufeng.base.lang.HKFKeys;
import org.hydrakyoufeng.base.lang.HKFValues;
import org.hydrakyoufeng.base.tool.collection.MU;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * 逻辑处理类，框架中推荐该类的所有方法定义均为：Map<String,Object> methodName(Map<String,Object>
 * param)
 * 其中methodName通过框架的解析，请求URL为：resource/{methodName}，Controller会自动根据{methodName}来调用该类中的相同名字的方法。
 * 方法的输入参数Map，是封装过的Map，用于封装客户端在Http中的请求参数，同时将Session和Application也封装进该Map中，
 * 使用session_scope和application_scope可以方便地访问到session和application。
 * 例：session_scope.name等于同操作session域中的name属性（需要搭配MT的get或者put等方法使用）。
 * 同SpringMVC一样，方法的输入参数也可以直接加上HttpSession，HttpServletRequest等参数，框架也会直接将这些对象传入进来。
 * 推荐返回为Map<String,Object>类型，这样在处理HTTP请求时，可以方便地传入到request的作用域中。其中url的key表示request的跳转地址，url中使用redirect:开头会完成重定向。
 * 如果是返回json对象，对返回类型无要求，框架会自动将结果转换为json对象。
 * 
 * @author HydraKyouFeng
 */
@Api(action = "qiniu", modelName = "七牛云")
public class QiniuService {
	
	@Autowired
	private QiniuRepository qiniuRepository;

	/**
	 * 获取公开空间的上传token
	 * 
	 * @return
	 * @throws Exception
	 */
	@ApiOperation(name = "获取公开空间上传token", notes = "用于获取公开空间上传token",type=HKFValues.TYPE_USER_NORMAL)
	@ApiResultParam(name = HKFKeys.CODE, dataType = DataType.Integer, value = "状态码")
	@ApiResultParam(name = HKFKeys.MESSAGE, dataType = DataType.Integer, value = "提示信息")
	@ApiResultParam(name = HKFKeys.DATA, dataType = DataType.Object, value = "文件的访问路径")
	@ApiResultParam(name = "token",parentName = HKFKeys.DATA,  dataType = DataType.String, value = "上传token")
	@ApiResultParam(name = "remoteAddr",parentName = HKFKeys.DATA,  dataType = DataType.String, value = "云盘域名")
	public Map<String, Object> getToken() throws Exception {
		return MU.ok(qiniuRepository.getToken());
	}

	/**
	 * 获取私有空间的上传token
	 * @return
	 * @throws Exception
	 */
	@ApiOperation(name = "获取私有空间上传token", notes = "用于获取私有空间上传token",type=HKFValues.TYPE_USER_NORMAL)
	@ApiResultParam(name = HKFKeys.CODE, dataType = DataType.Integer, value = "状态码")
	@ApiResultParam(name = HKFKeys.MESSAGE, dataType = DataType.Integer, value = "提示信息")
	@ApiResultParam(name = HKFKeys.DATA, dataType = DataType.Object, value = "文件的访问路径")
	@ApiResultParam(name = "token",parentName = HKFKeys.DATA,  dataType = DataType.String, value = "上传token")
	@ApiResultParam(name = "remoteAddr",parentName = HKFKeys.DATA,  dataType = DataType.String, value = "云盘域名")
	public Map<String, Object> getTokenSecret() throws Exception {
		return MU.ok(qiniuRepository.getTokenSecret());
	}

	@ApiOperation(name = "获取文件防盗链url", notes = "用于获取私有空间的文件防盗链url",type=HKFValues.TYPE_USER_NORMAL)
	@ApiImplicitParam(name = "key", dataType = DataType.String, value = "七牛云文件key",required = true)
	@ApiResultParam(name = HKFKeys.CODE, dataType = DataType.Integer, value = "状态码")
	@ApiResultParam(name = HKFKeys.MESSAGE, dataType = DataType.Integer, value = "提示信息")
	@ApiResultParam(name = HKFKeys.DATA, dataType = DataType.String, value = "文件的访问路径")
	public Map<String, Object> getSourceURL(Map<String,Object> param) throws Exception {
		return MU.ok(qiniuRepository.getSourceURL(param));
	}
}